package me.huqiao.loganlyzer.util;

import me.huqiao.loganlyzer.console.ShowHeadMsg;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class TomcatAccessLogValid {
    public static Map<String, String> logPatternMap=new HashMap<>();
    //日志格式映射
    static{
        /**
         * %a - 远程IP地址
         * %A - 本地IP地址
         * %b - 发送的字节数(Bytes sent), 不包括HTTP headers的字节，如果为0则展示’-’
         * %B - 发送的字节数(Bytes sent), 不包括HTTP headers的字节
         * %h - 远程主机名称(如果resolveHosts为false则展示IP)
         * %H - 请求协议
         * %l - 远程用户名，始终为’-'(Remote logical username from identd)
         * %m - 请求的方法(GET, POST等)
         * %p - 接受请求的本地端口
         * %q - 查询字符串，如果存在，有一个前置的’?’
         * %r - 请求的第一行(包括请求方法和请求的URI)
         * %s - response的HTTP状态码(200,404等)
         * %S - 用户的session ID
         * %t - 日期和时间，Common Log Format格式，使用%{yyyy-MM-dd HH:mm:ss}t控制格式化输出。
         * %u - 被认证的远程用户, 不存在则展示’-’
         * %U - 请求URL路径
         * %v - 本地服务名
         * %D - 处理请求的时间，单位为毫秒
         * %T - 处理请求的时间，单位为秒
         * %I - 当前请求的线程名(can compare later with stacktraces)
         * %{xxx}i: 传入请求标头的值。
         * %{xxx}o: 传出响应标头的值。
         * %{xxx}c: 特定cookie的值。
         * %{xxx}r: ServletRequest中某个属性的值。
         * %{xxx}s: HttpSession中某个属性的值
         */
        logPatternMap.put("%a","远程IP地址");
        logPatternMap.put("%A","本地IP地址");
        logPatternMap.put("%b","发送的字节数");
        logPatternMap.put("%B","远程IP地址");
        logPatternMap.put("%h","远程主机名称");
        logPatternMap.put("%H","请求协议");
        logPatternMap.put("%l","远程用户名");
        logPatternMap.put("%m","请求的方法");
        logPatternMap.put("%p","接受请求的本地端口");
        logPatternMap.put("%q","查询字符串");
        logPatternMap.put("%r","请求的第一行");
        logPatternMap.put("%s","HTTP状态码");
        logPatternMap.put("%S","用户的sessionID");
        logPatternMap.put("%t","日期和时间");
        logPatternMap.put("%u","被认证的远程用户");
        logPatternMap.put("%U","请求URL路径");
        logPatternMap.put("%v","本地服务名");
        logPatternMap.put("%D","处理请求的时间(ms)");
        logPatternMap.put("%T","处理请求的时间(s)");
        logPatternMap.put("%i","传入请求标头的值");
        logPatternMap.put("%o","传出响应标头的值");
        logPatternMap.put("%c","特定cookie的值");
        logPatternMap.put("%r","请求中某个属性的值");
        //logPatternMap.put("%s","Session中某个属性的值");
    }

    public static void setHeadMsg(ShowHeadMsg showHeadMsg) {
        if(null==showHeadMsg || StringUtil.isEmpty(showHeadMsg.getLogPattern())){
            return;
        }else{
            String logPatterns=showHeadMsg.getLogPattern();
            ArrayList<String> patternsList = new ArrayList<>();
            patternsList.add("\"");
            patternsList.add("&quot;");
            patternsList.add("\\([^()]*\\)");//匹配（）
            patternsList.add("\\{[^{}]*\\}");//匹配 {}
            patternsList.add("\\[[^\\[\\]]*\\]");//匹配 []
            for(String str:patternsList){
                logPatterns=logPatterns.replaceAll(str,"");
            }

            /**
             * 请求的第一行
             * "GET /t2/static/v3.2/images/login/language@2x.png HTTP/1.1"
             */
            logPatterns=logPatterns.replaceAll("%r+","%m %U %H");

            String strArray[]=logPatterns.split(" ");
            showHeadMsg.setLogPatternOld(strArray);

            String changeArry[]=new String[strArray.length];
            for(int i=0;i<strArray.length;i++){
                if("%a".equals(strArray[i])){//IP
                   showHeadMsg.setSingleRequestCountInt(i);
                }

                if("%s".equals(strArray[i])){//状态码
                    showHeadMsg.setRequestStatusCountInt(i);
                }

                if("%U".equals(strArray[i])){//请求路径
                    showHeadMsg.setStaticFileCountInt(i);
                }

                if("%D".equals(strArray[i]) || "%T".equals(strArray[i])){
                    showHeadMsg.setAnalysisTimeInt(i);
                }
                changeArry[i]=logPatternMap.get(strArray[i]);
                if(changeArry[i]==null){
                    changeArry[i]=strArray[i];
                }
            }
            showHeadMsg.setLogPatterns(changeArry);
            return;
        }
    }

//    public String[] change(String logPatterns){
//        if(StringUtil.isEmpty(logPatterns)){
//            return null;
//        }else{
//            ArrayList<String> patternsList = new ArrayList<>();
//            patternsList.add("\"");
//            patternsList.add("\\([^()]*\\)");//匹配（）
//            patternsList.add("\\{[^{}]*\\}");//匹配 {}
//            patternsList.add("\\[[^\\[\\]]*\\]");//匹配 []
//            for(String str:patternsList){
//                logPatterns=logPatterns.replaceAll(str,"");
//            }
//            String strArray[]=logPatterns.split(" ");
//            String changeArry[]=new String[strArray.length];
//            for(int i=0;i<strArray.length;i++){
//                changeArry[i]=logPatternMap.get(strArray[i]);
//                if(changeArry[i]==null){
//                    changeArry[i]=strArray[i];
//                }
//            }
//            return changeArry;
//        }
//    }

    public static void main(String[] args) {
        TomcatAccessLogValid tomcatAccessLogValid=new TomcatAccessLogValid();
        //select 0,1,3 from a limit 10
        String str="%h %l %u %t &quot;%r&quot; %s %b";
        //String str="%a %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-Agent}i\" %6";
        ShowHeadMsg showHeadMsg=new ShowHeadMsg();
        showHeadMsg.setLogPattern(str);
        tomcatAccessLogValid.setHeadMsg(showHeadMsg);
        String change[]=showHeadMsg.getLogPatterns();
        for(String s:change){
            System.out.println(s);
        }
    }
}
